package com.zp.self.module.level_4_算法练习.算法.双指针.左右指针;
import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

/**
 * @author By ZengPeng
 */
public class 力扣_929_独特的电子邮件地址 {
    @Test
    public void main() {
        
        Solution solution = new 力扣_929_独特的电子邮件地址().new Solution();
        System.out.println(solution.numUniqueEmails(new String[]{"test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"}));
    }

    /**
     题目：每个 有效电子邮件地址 都由一个 本地名 和一个 域名 组成，以 '@' 符号分隔。除小写字母之外，电子邮件地址还可以含有一个或多个 '.' 或 '+' 。
         例如，在 alice@leetcode.com中， alice 是 本地名 ，而 leetcode.com 是 域名 。

         如果在电子邮件地址的 本地名 部分中的某些字符之间添加句点（'.'），则发往那里的邮件将会转发到本地名中没有点的同一地址。请注意，此规则 不适用于域名 。
         例如，"alice.z@leetcode.com” 和 “alicez@leetcode.com” 会转发到同一电子邮件地址。

         如果在 本地名 中添加加号（'+'），则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件。同样，此规则 不适用于域名 。
         例如 m.y+name@email.com 将转发到 my@email.com。

         可以同时使用这两个规则。
         给你一个字符串数组 emails，我们会向每个 emails[i] 发送一封电子邮件。返回实际收到邮件的不同地址数目。

     示例 1：
     输入：emails = ["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
     输出：2
     解释：实际收到邮件的是 "testemail@leetcode.com" 和 "testemail@lee.tcode.com"。

     示例 2：
     输入：emails = ["a@leetcode.com","b@leetcode.com","c@leetcode.com"]
     输出：3


     分析：【P 💖💖】
        1.遍历：双指针判断每个字符串的真实邮箱，创建新的数组，创建字符串，存入Set
                --执行耗时:8 ms,击败了61.16% 的Java用户
                --编码耗时:[26:30]

     边界值 & 注意点：
        1.
     **/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int numUniqueEmails(String[] emails) {
        Set<String> res = new HashSet<>();
        for (String email : emails) {
            char[] chars = email.toCharArray();
            int index=0,length=chars.length,mark=0;
            while (index<length){
                if(chars[index]=='@')
                    break;
                if(chars[index]=='+'){
                    index = email.indexOf('@');
                    break;
                }
                if(chars[index]!='.')
                    chars[mark++] =chars[index];
                index++;
            }
            char[] newStr = new char[mark+length-index];
            System.arraycopy(chars,0,newStr,0,mark);
            System.arraycopy(chars,index,newStr,mark,length-index);
            res.add(String.valueOf(newStr));
        }
        System.out.println(res);
        return res.size();
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}